1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
import type { Metadata } from "next";
import { notFound } from "next/navigation";
import NoBookmarksBanner from "@/components/dashboard/bookmarks/NoBookmarksBanner";
import PublicBookmarkGrid from "@/components/public/lists/PublicBookmarkGrid";
import PublicListHeader from "@/components/public/lists/PublicListHeader";
import { api } from "@/server/api/client";
import { TRPCError } from "@trpc/server";
export async function generateMetadata(props: {
params: Promise<{ listId: string }>;
}): Promise<Metadata> {
const params = await props.params;
try {
const resp = await api.publicBookmarks.getPublicListMetadata({
listId: params.listId,
});
return {
title: `${resp.name} by ${resp.ownerName} - Karakeep`,
description:
resp.description && resp.description.length > 0
? `${resp.description} by ${resp.ownerName} on Karakeep`
: undefined,
applicationName: "Karakeep",
authors: [
{
name: resp.ownerName,
},
],
};
} catch (e) {
if (e instanceof TRPCError && e.code === "NOT_FOUND") {
notFound();
}
}
return {
title: "Karakeep",
};
}
export default async function PublicListPage(props: {
params: Promise<{ listId: string }>;
}) {
const params = await props.params;
try {
const { list, bookmarks, nextCursor } =
await api.publicBookmarks.getPublicBookmarksInList({
listId: params.listId,
});
return (
<div className="space-y-3">
<PublicListHeader
list={{
id: params.listId,
name: list.name,
description: list.description,
icon: list.icon,
numItems: list.numItems,
ownerName: list.ownerName,
}}
/>
{list.numItems > 0 ? (
<PublicBookmarkGrid
list={{
id: params.listId,
name: list.name,
description: list.description,
icon: list.icon,
numItems: list.numItems,
ownerName: list.ownerName,
}}
bookmarks={bookmarks}
nextCursor={nextCursor}
/>
) : (
<NoBookmarksBanner />
)}
</div>
);
} catch (e) {
if (e instanceof TRPCError && e.code === "NOT_FOUND") {
notFound();
}
}
}
|